package main

import (
	"encoding/json"
	"fmt"
	"net"
	"os"
)

type ChatInfo struct {
	InfoType   int //1.注册，2.登录，3.聊天消息
	UserName   string
	UserPasswd string
	Info       string
}

var UserName string

func main() {
	Conn, err := net.Dial("tcp", "192.168.1.107:8888")
	if err != nil {
		fmt.Println(err)
		return
	}
	Init(Conn)
	go RecvChatInfo(Conn)
	for {
	}
}

// 界面初始化
func Init(Conn net.Conn) {
	fmt.Println("---------------请选择功能---------------")
	fmt.Println("---------------1.用户注册---------------")
	fmt.Println("---------------2.用户登录---------------")
	fmt.Println("---------------3.退出界面---------------")
	var val int
	fmt.Scanf("%d", &val)
	switch val {
	case 1: //注册
		RegisterOrLogin(Conn, false)
	case 2: //登录
		RegisterOrLogin(Conn, true)
	case 3: //退出
		os.Exit(0)
	default:
		fmt.Println("输入错误！")
	}
}

// 登录还是注册
func RegisterOrLogin(Conn net.Conn, Login bool) {
	fmt.Println("------请输入用户名及密码用空格隔开------")
	var info ChatInfo
	fmt.Fscanf(os.Stdin, "%s %s", &info.UserName, &info.UserPasswd)
	UserName = info.UserName
	if Login {
		info.InfoType = 2
	} else {
		info.InfoType = 1
	}
	Senddata(Conn, info)
}

// 发送聊天信息
func SendChatInfo(Conn net.Conn) {
	defer Conn.Close()
	var info ChatInfo
	info.InfoType = 3
	info.UserName = UserName
	for {
		_, err := fmt.Scanln(&info.Info)
		if err != nil {
			fmt.Println(err)
			return
		}
		Senddata(Conn, info)
	}
}

// 接收服务器发来的信息
func RecvChatInfo(Conn net.Conn) {
	defer Conn.Close()
	var info ChatInfo
	for {
		recvdata := make([]byte, 1024)
		length, err := Conn.Read(recvdata)
		if err != nil {
			fmt.Println(err)
			return
		}
		if length > 0 {
			err = json.Unmarshal(recvdata[:length], &info)
			if err != nil {
				fmt.Println(err)
				return
			}
			switch info.InfoType {
			case 1: //注册时回复的信息
				fmt.Println(info.Info)
				Init(Conn)
			case 2: //登录时回复的信息
				fmt.Println(info.Info)
				if info.Info == "登录成功！" {
					fmt.Println("聊天过程中输入quit退出聊天室！")
					go SendChatInfo(Conn)
				} else {
					Init(Conn)
				}
			case 3: //聊天时收到的其他用户发送的信息
				if info.UserName != UserName {
					fmt.Printf("[%s]说:%s\n", info.UserName, info.Info)
				}
			}
		}
	}
}

// 结构体转byte再发送
func Senddata(Conn net.Conn, info ChatInfo) {
	Data, err := json.Marshal(info)
	_, err = Conn.Write(Data)
	if err != nil {
		fmt.Println(err)
		return
	}
}
